#include <bits/stdc++.h>
using namespace std;

/*
3000. 对角线最长的矩形的面积
已解答
简单
相关标签
premium lock icon
相关企业
提示
给你一个下标从 0 开始的二维整数数组 dimensions。

对于所有下标 i（0 <= i < dimensions.length），dimensions[i][0] 表示矩形 i 的长度，而 dimensions[i][1] 表示矩形 i 的宽度。

返回对角线最 长 的矩形的 面积 。如果存在多个对角线长度相同的矩形，返回面积最 大 的矩形的面积。

 

示例 1：

输入：dimensions = [[9,3],[8,6]]
输出：48
解释：
下标 = 0，长度 = 9，宽度 = 3。对角线长度 = sqrt(9 * 9 + 3 * 3) = sqrt(90) ≈ 9.487。
下标 = 1，长度 = 8，宽度 = 6。对角线长度 = sqrt(8 * 8 + 6 * 6) = sqrt(100) = 10。
因此，下标为 1 的矩形对角线更长，所以返回面积 = 8 * 6 = 48。
示例 2：

输入：dimensions = [[3,4],[4,3]]
输出：12
解释：两个矩形的对角线长度相同，为 5，所以最大面积 = 12。
 

提示：

1 <= dimensions.length <= 100
dimensions[i].length == 2
1 <= dimensions[i][0], dimensions[i][1] <= 100
*/

// 法一
class Solution {
public:
    using ll = long long;
    int areaOfMaxDiagonal(vector<vector<int>>& dimensions) {
        // 记录最大对角线的平方 
        ll maxDiagSq = 0;
        int maxArea = 0;        // 对应最大对角线的最大面积
        for (auto& rect : dimensions) {
            int len = rect[0];
            int width = rect[1];

            ll diagSq = (ll)len * len + (ll)width * width;
            int area = len * width;

            // 当前对角线更长 更新最大对角线和对应面积
            if (diagSq > maxDiagSq) {
                maxDiagSq = diagSq;
                maxArea = area;
            }
            // 对角线长度相同的情况 选择len跟width更接近的  （面积更大）
            else if (diagSq == maxDiagSq) {
                if (area > maxArea)     maxArea = area;
            }
        }
        return maxArea;
    }
};

// 法二
class Solution {
public:
    using ll = long long;
    int areaOfMaxDiagonal(vector<vector<int>>& dimensions) {
        // pair存储(对角线平方和, 面积)，用于比较
        pair<int, int> res;
        
        for (auto d : dimensions) {
            int x = d[0], y = d[1];
            // 计算当前矩形的对角线平方和与面积，用max比较更新
            // pair比较规则：先比第一个元素（对角线平方和），相等则比第二个（面积）
            res = max(res, pair(x * x + y * y, x * y));
        }

        // 返回最大对角线对应的最大面积
        return res.second;
    }
};